/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controleur;

import Entites.Elfe;
import Entites.Espece;
import Entites.Magicien;
import Entites.Troll;
import Interfaces.InterfacePopulation;
import java.util.ArrayList;
import java.util.Random;

/**
 * 
 * @author Raphaël
 */
public class Population implements InterfacePopulation {

    private static int NOMBRE_GENERATION = 101;
    private ArrayList<Espece> unePopulation;
    private int nombrePopulation;
    private int nombreTroll = 0;
    private int nombreMagicien = 0;
    private int nombreElfe = 0;

    public Population() {
        unePopulation = new ArrayList<Espece>();
    }

    public Population(ArrayList<Espece> unePopulation) {
        this.unePopulation = unePopulation;
    }

    private void switchPopulation(int variation) {
        switch (variation) {
            case 0:
                unePopulation.add(new Troll());
                nombreTroll++;
                break;
            case 1:
                unePopulation.add(new Magicien());
                nombreMagicien++;
                break;
            case 2:
                unePopulation.add(new Elfe());
                nombreElfe++;
                break;
            default:
                break;
        }
    }

    @Override
    public ArrayList<Espece> genererPopulation() {
        Random rand = new Random();
        nombrePopulation = rand.nextInt(NOMBRE_GENERATION);
        Random genTypeEspece = new Random();
        for (int i = 0; i < nombrePopulation; i++) {
            switchPopulation(genTypeEspece.nextInt(3));
        }
        return unePopulation;
    }

    @Override
    public ArrayList<Espece> getUnePopulation() {
        return unePopulation;
    }

    @Override
    public void setUnePopulation(ArrayList<Espece> unePopulation) {
        this.unePopulation = unePopulation;
        recalcNombreEspece();
    }

    @Override
    public void ajouterEspece(Espece uneEspece) {
        unePopulation.add(uneEspece);
    }

    @Override
    public void supprimerEspece(Espece uneEspece) {
        nombrePopulation--;
        if (uneEspece.toString().equals(Troll.getType())) {
            nombreTroll--;
        } else if (uneEspece.toString().equals(Magicien.getType())) {
            nombreMagicien--;
        } else {
            nombreElfe--;
        }
        unePopulation.remove(uneEspece);
    }

    @Override
    public void afficheTout() {
        int nombreEspece = 1;
        for (Espece lEspece : unePopulation) {
            System.out.println("/-------------------------------------\\");
            System.out.println("Numéro : " + nombreEspece);
            System.out.println("Type : " + lEspece.toString());
            lEspece.afficheEspece();
            System.out.println("\\-------------------------------------/");
            nombreEspece++;
        }
    }

    @Override
    public ArrayList<Espece> genererPopulation(int nombreEspece) {
        Random genTypeEspece = new Random();
        nombrePopulation = nombreEspece;
        for (int i = 0; i < nombreEspece; i++) {
            switchPopulation(genTypeEspece.nextInt(3));
        }
        return unePopulation;
    }

    @Override
    public int getNombreAll() {
        return nombrePopulation;
    }

    @Override
    public int getNombreTroll() {
        return nombreTroll;
    }

    @Override
    public int getNombreElfe() {
        return nombreElfe;
    }

    @Override
    public int getNombreMagicien() {
        return nombreMagicien;
    }

    @Override
    public ArrayList getInformationEspece(int es) {
        return unePopulation.get(es).getAll();
    }
    

    @Override
    public ArrayList<String> getAllNom() {
        ArrayList<String> allNom = new ArrayList<>();
        for (Espece lEspece : unePopulation) {
            allNom.add((String) lEspece.getAll().get(0));
        }
        return allNom;
    }

    @Override
    public void vieillir() {
        for (Espece lEspece : unePopulation) {
            lEspece.veillirEspece();
        }
    }

    @Override
    public void recalcNombreEspece() {
        nombrePopulation = unePopulation.size();
        nombreElfe = 0;
        nombreMagicien = 0;
        nombreTroll = 0;
        for (Espece lEspece : unePopulation) {
            if (lEspece.toString().equals(Troll.getType())) {
                nombreTroll++;
            } else if (lEspece.toString().equals(Magicien.getType())) {
                nombreMagicien++;
            } else {
                nombreElfe++;
            }
        }
    }
}
